// 防止头文件重复包含的机制
#ifndef __GPIO_H__
#define __GPIO_H__ 
// 声明一个结构体类型 
typedef struct{
	volatile unsigned int OUT;
	volatile unsigned int OUTENB;
	volatile unsigned int DETMODE0; 
	volatile unsigned int DETMODE1;
	volatile unsigned int INTENB;
	volatile unsigned int DET;
	volatile unsigned int PAD;
	volatile unsigned int RSVD;
	volatile unsigned int ALTFN0;
	volatile unsigned int ALTFN1;
	volatile unsigned int DETMODEEX;
	volatile unsigned int RSVD1[4];
	volatile unsigned int DETENB;
}gpio_t;
#if 0
#define  GPIOA  (*(gpio_t *)0xC001A000)
// GPIOA.OUT
#define  GPIOB  (*(gpio_t *)0xC001B000)
#define  GPIOC  (*(gpio_t *)0xC001C000)
#define  GPIOD  (*(gpio_t *)0xC001D000)
#define  GPIOE  (*(gpio_t *)0xC001E000)
#else

#define  GPIOA  ((gpio_t *)0xC001A000)
// GPIOA->OUT
#define  GPIOB  ((gpio_t *)0xC001B000)
#define  GPIOC  ((gpio_t *)0xC001C000)
#define  GPIOD  ((gpio_t *)0xC001D000)
#define  GPIOE  ((gpio_t *)0xC001E000)
#endif

#define  GPIO_PIN_0   0x00000001
#define  GPIO_PIN_1   0x00000002
#define  GPIO_PIN_2   0x00000004
#define  GPIO_PIN_3   0x00000008
#define  GPIO_PIN_4   0x00000010
#define  GPIO_PIN_5   0x00000020
#define  GPIO_PIN_6   0x00000040
#define  GPIO_PIN_7   0x00000080
#define  GPIO_PIN_8   0x00000100
#define  GPIO_PIN_9   0x00000200
#define  GPIO_PIN_10  0x00000400
#define  GPIO_PIN_11  0x00000800
#define  GPIO_PIN_12  0x00001000
#define  GPIO_PIN_13  0x00002000
#define  GPIO_PIN_14  0x00004000
#define  GPIO_PIN_15  0x00008000
#define  GPIO_PIN_16  0x00010000
#define  GPIO_PIN_17  0x00020000
#define  GPIO_PIN_18  0x00040000
#define  GPIO_PIN_19  0x00080000
#define  GPIO_PIN_20  0x00100000
#define  GPIO_PIN_21  0x00200000
#define  GPIO_PIN_22  0x00400000
#define  GPIO_PIN_23  0x00800000
#define  GPIO_PIN_24  0x01000000
#define  GPIO_PIN_25  0x02000000
#define  GPIO_PIN_26  0x04000000
#define  GPIO_PIN_27  0x08000000
#define  GPIO_PIN_28  0x10000000
#define  GPIO_PIN_29  0x20000000
#define  GPIO_PIN_30  0x40000000
#define  GPIO_PIN_31  0x80000000


typedef enum{
	ALT0 = 0,
	ALT1,
	ALT2,
	ALT3,
}altfn_t;

typedef enum{
	IN_MODE = 0,
	OUT_MODE,
}mode_t;

typedef enum{
	LOW_LEVEL = 0,
	HIGH_LEVEL,
}level_t;
/*
 * 函数功能：GPIO引脚功能的初始化 
 * 参数： 
 * 	@ gpio : 那组gpio引脚
 * 	@ pin : 哪个引脚
 * 	@ alt : GPIO引脚功能选择
 * 返回值：无
 * */
void hal_gpio_init(gpio_t *gpio, unsigned int pin, altfn_t alt);
/*
 * 函数功能：GPIO引脚输入输出模式配置 
 * 参数： 
 * 	@ gpio : 那组gpio引脚
 * 	@ pin : 哪个引脚
 * 	@ mode : 引脚的模式选择
 * 返回值：无
 * */

void hal_gpio_mode(gpio_t *gpio, unsigned int pin, mode_t mode);

/*
 * 函数功能：GPIO引脚输出的高低电平
 * 参数： 
 * 	@ gpio : 那组gpio引脚
 * 	@ pin : 哪个引脚
 * 	@ level : 输出高低电平
 * 返回值：无
 * */
void hal_gpio_write(gpio_t *gpio, unsigned int pin, level_t level);

/*
 * 函数功能：GPIO引脚输入的高低电平
 * 参数： 
 * 	@ gpio : 那组gpio引脚
 * 	@ pin : 哪个引脚
 * 返回值：引脚输入的高低电平
 * */

level_t hal_gpio_read(gpio_t *gpio, unsigned int pin);
#endif 
